#ifndef __command_H__
#define __command_H__

#include "func.h"

#define BUFFERSIZE 4096
//私有通信协议， 因为TCP通信是字节流，没有边界，
//通过私有协议，能让发送接收方遵守确定的边界，接收数据
//定义一个小火车的私有协议-----发送命令也需要用小火车，不然不知道命令得边界在哪里，尤其后面又跟数据时
typedef struct train_t {
    int length;
    char buf[BUFFERSIZE];
} train_t;

//客户端需要避免通常的ERROR_CHECK终止程序吗，需要
//客端这边的错误处理，不用发送网络消息，只需本地打印错误---好像没用过
#define ERROR_CHECK_G(retVal, val, msg)\
{\
    char error_buf[128];\
    if (val == retVal) {\
        sprintf(error_buf, "%s,%s", msg, " No such file or directory");\
        return -1;\
    }\
}

typedef struct command_t {
    char com[20];
    char name[100];
    char command[100];  //有时要传服务器完整命令，
}command_t;

//int delete_enter(char** str);
int do_command(char* command, int fd);
int prase(char* command, command_t* pcom);
int search(char* com);
void execute(command_t* pcom, int fd);
int send_command(char* command, int peerfd);
//void error_check(int retVal, int val, char* msg, char* answer);

//传输文件
off_t statSize(int fileFd);
int sendn(int fd, const void* str, int len);
int recvn(int fd, const void* str, int len);

//上传文件
//还是需要一个通信的文件描述符的
int choiceHow(int peerfd, const command_t* pcom);
int putsfile(int fd, const char* fpilename);  //自己打开一个文件，获得文件描述符
int putsFileInterrupt(int peerfd, const char* filename);

//下载文件的函数
int recvFile(const char *filename,int peerfd);      //续传
int choiceFile(int peerfd,const char* filename);    //选择传输方式
int isInserver(const char *filename);
int getFile(int fd,const char *filename);
#endif
